﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using COFE.Core.Profile;
using System.IO;
using COFE.Core.Logger;
using COFE.Core.EntryType;
using COFE.Core.Filter;
using COFE.Core.Utils;
using COFE.Core.Lister;
using COFE.Core.Entry;

namespace COFE.Core.Plugin
{
    public interface ICOFEPlugin : IPlugin
    {
        IVolumeRegistrar VolumeRegistrar { get; }
        ISecondaryPropertyProviderManager SecondaryPropertyProviderManager { get; }
        IPropertyDictionary PropertyDictionary { get; }
        IPathParser PathParser { get; }
        IEntryConstructor EntryConstructor { get; }
        IEntryListRegistrar EntryListRegistrar { get; }
        IUserProfileManager UserProfileManager { get; }
        IEntryTypeDictionary EntryTypeDictionary { get; }

        IEventDispatcher<FileSystemEventArgsExA> FileSystemEventDispatcher { get; }
        IEventLogger<FileSystemEventArgsExA> FileSystemEventLogger { get; }

        /// <summary>
        /// Return a list of Directorylister factories, which construct directory listers (Volumes)
        /// </summary>
        List<IFactory<IDirectoryLister>> DirectoryListerFactories { get; }

        List<ISecondaryPropertyProvider<IEntryList>> EntryListPropertyProviders { get; }
        List<ISecondaryPropertyProvider<IFileSystemInfo>> EntryPropertyProviders { get; }
        List<ISecondaryPropertyProvider<IEventLog>> EventLogPropertyProviders { get; }

        /// <summary>
        /// Return a list of properties, e.g. FileInfoProperties.Length
        /// </summary>
        List<object> Properties { get; }

        /// <summary>
        /// Return a list of entry filter to be registered, 
        /// using a tuple containing filter type and it's constructor (id, param) -> filter.
        /// </summary>
        List<Type> EntryFilters { get; }

        /// <summary>
        /// Return the icon provider for an entry filter, not necessary registered in the same plugin.
        /// </summary>
        List<Tuple<Type, IEntryTypeIconProvider>> EntryFilterIconProviders { get; }

        /// <summary>
        /// Return a list of lookup filter to be registered, 
        /// using a tuple containing filter type and it's constructor (id, param) -> filter.
        /// </summary>
        List<Type> LookupFilters { get; }
        
    }

    public static class ICOFEPluginExtension
    {
       
    }
}
